/**
 * author:半盏凉茶
 * date:2011-08-05
 */
 
//图片轮换 &图片不间断滚动
(function(){
	Simple.declare('Slide',null,{
		node : null,//轮换最外层的对象 ,所有子节点都基于node范围内进行查找
		triggers: null, //控制图片轮换的对象   可以传入一个对象或者boolean值  true 为生成triggers
		triggersClass: 'triggers', //triggers 样式类
		triggersCurrentClass: 'current', //triggers 当前样式类
		contents: null, //图片轮换的内容项
		auto : false, //是否自动滚动
		delay: 0,//操作延时
		bindEvent: 'mouseover', //触发事件
		direction: 'top',//滚动方向 {参数为 top,right,bottom,left}
		setup: 1,//一次滚动多少个
		timeout: 3000, //间歇多久
		speed: 300,//每次滚动花费时间
		next: null,//下一个
		prev: null,//上一个
		_current: 0,//当前第多少张
		_timer: null,//计时器
		init : function(){
			var self = this;
			self.node = $(self.node); //将node节点转为jquery对象
			
			self._validate(self); // 校验参数并转化成对象  & 时间绑定
			
			//self._direction = null; // 缓存方向 减少程序判断时间
			
			self._move(self); //初始化第一个
						
			if(self.auto){
				self._timer = setInterval(function(){
					self.next.click();
				}, self.timeout);
			}
			
			if(self.bindEvent.indexOf('click') == -1){
				self.bindEvent += ' click';
			}
			
			self.next.bind(self.bindEvent, function(){
				if(self._current + 1 >= self._contentC){
					self._current = 0;
				}else{
					self._current++;
				}
				self._move(self);
			});
			
			self.prev.bind(self.bindEvent, function(){
				if(self._current - 1 <= 0){
					self._current = 0;
				}else{
					self._current--;
				}
				self._move(self);
			});
		},
		_move: function(self){//滚动代码
			if(self.direction){
				self.direction = self.direction.toLowerCase();//参数容错 统一转换为小写
				switch(self.direction){
					case 'top':
						_setHeight();
						self._moveTop(self);
						break;
					case 'left':
						_setWidth();
						self._moveLeft(self);
						break;
					default:
						Y.log('direction参数范围 [top | left]');
						break;
				}
				
				if(self.triggers){
					self.triggers.eq(self._current).addClass(self.triggersCurrentClass).siblings().removeClass(self.triggersCurrentClass);
				}
			}else{
				Y.log('请指定滚动方向！');
				return;
			}
			
			function _setHeight(){
				self._direction = self.direction;
				self._contentP.height(self._contentSumH);
			}
			
			function _setWidth(){
				self._direction = self.direction;
				self.contents.css({'float':'left', 'display': 'inline'});
				self._contentP.width(self._contentSumW);
			}
		},
		_moveTop: function(self){//向上滚动
			self._contentP.stop().animate({top : -(self._contentSumSetupH * self._current)}, self.speed);
		},
		_moveLeft: function(self){//向左滚动
			self._contentP.stop().animate({left : -(self._contentSumSetupW * self._current)}, self.speed);
		},
		_validate : function(self){//对参数进行校验和转化
			if(self.contents){
				self.contents = self.node.find(self.contents);
				
				self._contentC = self.contents.length;//获取总共有多少个轮换项
				self._contentW = self.contents.width();//获取contents项的宽度
				self._contentH = self.contents.height(); //获取contents项的高度
				self._contentSumW = self._contentW * self._contentC; //contents的总宽度
				self._contentSumH = self._contentH * self._contentC; //contents的总宽度
				self._contentP = self.contents.parent();//contents 的父级
				
				self._contentSumSetupH = self._contentH * self.setup;//计算每次滚动的高度
				self._contentSumSetupW = self._contentW * self.setup;//计算每次滚动的宽度
				
				self._contentP.css('position', 'relative');
			}else{
				Y.log('必须传入 contents 参数！');
				return;
			}
			
			if(self.triggers){
				if(typeof(self.triggers) ===  'string'){
					self.triggers = self.node.find(self.triggers);
				}else if(typeof(self.triggers) === 'boolean'){//创建triggers
					var triggersTemp = '<ol class="'+ self.triggersClass +'">';
					var count = Math.ceil(self._contentC / self.setup);
					
					for(var i=1; i<= count; i++){
						triggersTemp += '<li>' + i + '</li>';
					}
					triggersTemp += '</ol>';
					
					self.node.append(triggersTemp);
					self.triggers = self.node.find('.' + self.triggersClass + ' li');
				}else{
					Y.log('triggers 对象错误！')
				}
			}
			
			if(self.triggers){
				self.triggers.bind(self.bindEvent, function(){
					$(this).addClass(self.triggersCurrentClass).siblings().removeClass(self.triggersCurrentClass);
					self._current = $(this).index() - 1;
					clearInterval(self._timer);
					self.next.click();
				}).bind('mouseout',function(){
					if(self.auto){
						self._timer = setInterval(function(){
							self.next.click();
						}, self.timeout);
					}
				});
			}
			
			if(typeof(self.next) === 'string'){
				self.next = self.node.find(self.next);
			}else{
				self.next = $('<a href="javascript:void(0);" class="next"></a>');
				self.node.append(self.next);
			}
			
			if(typeof(self.prev) === 'string'){
				self.prev = self.node.find(self.prev);
			}else{
				self.prev = $('<a href="javascript:void(0);" class="prev"></a>');
				self.node.append(self.prev);
			}
		}
	});
})();
